import { IVec2 } from "../../util/Defined";
import { IPoolObj, Pool, RecyclePoolObj } from "../../util/Pool";
import { Matrix } from "../math/Matrix";
import { Rect } from "../math/Rect";

export enum ShapeType {
    /** 圆形 */
    circle,
    /** 矩形(不支持旋转) */
    rect,
    /** 盒子 */
    box,
    /** 多边形 */
    polygon,

    //===以下图形适合用来做技能范围判定，不能用来做常规碰撞检测

    /** 镂空圆形 */
    hollowCircle,
    /** 扇形 */
    sector,
}

/**
 * 图形基类
 */
export abstract class BaseShape extends RecyclePoolObj implements IVec2 {
    /** 中心点偏移x */
    x: number = 0;
    /** 中心点偏移y */
    y: number = 0;
    /** AABB盒子 */
    worldAABB = new Rect();

    /**
     * 设置中心点偏移
     * @param x
     * @param y
     */
    setOffset(x: number, y: number) {
        this.x = x;
        this.y = y;
        return this;
    }

    /**
     * 设置中心点偏移
     * @param pos
     */
    setOffsetTo(pos: IVec2) {
        this.x = pos.x;
        this.y = pos.y;
        return this;
    }

    onFree(): void {
        this.x = 0;
        this.y = 0;
        this.pool = null;
    }

    /**
     * 回收
     */
    free() {
        this.pool.free(this);
    }

    /**
     * 获取图形类型
     */
    abstract getType(): ShapeType

    /**
     * 更新图形
     * @param pos 世界位置
     * @param trans 变换
     */
    abstract update(pos: Readonly<IVec2>, trans?: Matrix): this

    /**
     * 碰撞检测
     * @param shape 
     */
    abstract testCollide(shape: Readonly<BaseShape>): boolean

}